/* 
 * ChamadoBO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.business.impl;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.mail.MessagingException;

import br.com.pma.chamatec.business.IChamadoBO;
import br.com.pma.chamatec.dao.ChamadoDAO;
import br.com.pma.chamatec.dominio.TipoSituacao;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.util.ChamatecUtil;
import br.com.pma.chamatec.util.UtilDate;
import br.com.pma.chamatec.vo.EmailVO;
import br.com.pma.entity.Chamado;
import br.com.pma.entity.Usuario;

/**
 * Classe de negócio da entidade Chamado.
 *
 * @author Ludemeula Fernandes de Sá
 */
@Stateless
public class ChamadoBO implements IChamadoBO {
	@Inject
	private ChamadoDAO chamadoDAO;

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#salvar(br.com.pma.entity.Chamado)
	 */
	@Override
	public Chamado salvar(Chamado chamado) throws ChamatecNegocioException {
		chamado.setDataAbertura(new Date());
		chamado.setIsAvaliado(0L);
		chamado.setIsAutorizado(0L);
		chamado.setIsExecutado(0L);
		chamado.setIsAgendado(0L);
		chamado.setStatus(TipoSituacao.ABERTO.getDescricao());

		validaCamposObrigatorios(chamado);
		return persistirDados(chamado);
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#avaliar(br.com.pma.entity.Chamado)
	 */
	@Override
	public Chamado avaliar(Chamado chamado) throws ChamatecNegocioException {
		chamado.setIsAvaliado(TipoSituacao.AVALIADO.getCodigo());
		chamado.setStatus(TipoSituacao.AVALIADO.getDescricao());

		return persistirDados(chamado);
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#aprovar(br.com.pma.entity.Chamado)
	 */
	@Override
	public Chamado aprovar(Chamado chamado) throws ChamatecNegocioException {
		chamado.setDataAutorizacao(new Date());
		chamado.setIsAutorizado(TipoSituacao.AUTORIZADO.getCodigo());
		chamado.setSituacao(TipoSituacao.APROVADO.getCodigo());
		chamado.setStatus(TipoSituacao.APROVADO.getDescricao());

		chamado = chamadoDAO.merge(chamado);
		enviarEmailAprovacao(chamado);
		return chamado;
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#reprovar(br.com.pma.entity.Chamado)
	 */
	@Override
	public Chamado reprovar(Chamado chamado) throws ChamatecNegocioException {
		chamado.setDataAutorizacao(new Date());
		chamado.setIsAutorizado(TipoSituacao.AUTORIZADO.getCodigo());
		chamado.setSituacao(TipoSituacao.REPROVADO.getCodigo());
		chamado.setStatus(TipoSituacao.REPROVADO.getDescricao());

		if (chamado.getMotivoReprovacao() == null || chamado.getMotivoReprovacao().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		enviarEmailReprovacao(chamado);
		return persistirDados(chamado);
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#executar(br.com.pma.entity.Chamado)
	 */
	@Override
	public Chamado executar(Chamado chamado) throws ChamatecNegocioException {
		chamado.setIsExecutado(TipoSituacao.EXECUTADO.getCodigo());
		chamado.setStatus(TipoSituacao.EXECUTADO.getDescricao());

		return persistirDados(chamado);
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#getListDescricao()
	 */
	@Override
	public List<Chamado> getListDescricao() throws ChamatecNegocioException {
		List<Chamado> retorno = chamadoDAO.getListDescricao();

		return retorno;
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#pesquisar(br.com.pma.entity.Chamado, br.com.pma.entity.Usuario, br.com.pma.entity.Usuario)
	 */
	@Override
	public List<Chamado> pesquisar(Chamado chamado, Usuario solicitante, Usuario usuario) throws ChamatecNegocioException {
		List<Chamado> retorno = chamadoDAO.pesquisar(chamado, solicitante, usuario);
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#acompanhar(br.com.pma.entity.Chamado, br.com.pma.entity.Usuario, br.com.pma.entity.Usuario)
	 */
	@Override
	public List<Chamado> acompanhar(Chamado chamado, Usuario solicitante, Usuario usuario) throws ChamatecNegocioException {
		List<Chamado> retorno = chamadoDAO.acompanhar(chamado, solicitante, usuario);
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * @see br.com.pma.chamatec.business.IChamadoBO#gerar(br.com.pma.entity.Chamado, java.util.Date, java.util.Date)
	 */
	@Override
	public List<Chamado> gerar(Chamado chamado, Date dataInicial, Date dataFinal) throws ChamatecNegocioException {
		List<Chamado> retorno = chamadoDAO.gerar(chamado, dataInicial, dataFinal);
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * Realiza a validação dos campos obrigatórios.
	 * 
	 * @param chamado
	 * @throws ChamatecNegocioException
	 */
	private void validaCamposObrigatorios(Chamado chamado) throws ChamatecNegocioException {
		if (chamado.getUsuarioSolicitacao() == null || chamado.getUsuarioSolicitacao().getId() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (chamado.getUnidade() == null || chamado.getUnidade().getId() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (chamado.getDepartamento() == null || chamado.getDepartamento().getId() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (chamado.getResumo() == null || chamado.getResumo().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (chamado.getDescricao() == null || chamado.getDescricao().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}
	}

	/**
	 * Persiste os dados de chamado.
	 * 
	 * @param chamado
	 * @return
	 */
	private Chamado persistirDados(Chamado chamado) {
		chamado = chamadoDAO.merge(chamado);
		return chamado;
	}
	
	/**
	 * Envia email para o usuário quando o chamado é aprovado.
	 * 
	 * @throws ChamatecNegocioException
	 */
	private void enviarEmailAprovacao(Chamado chamado) throws ChamatecNegocioException {
		EmailVO email = new EmailVO();
		ChamatecUtil.obterConfiguracoesEmail(email);
		
		StringBuffer corpo = new StringBuffer();
		corpo.append("<p>Prezado(a) Colaborador(a),</b></p>");

		corpo.append("<p style='text-align: justify;'>Informamos que o seu chamado foi <b>aprovado</b>.</p>");
		corpo.append("<table cellpadding='2' cellspacing='2' style='border:1px solid #C4C0C9; text-align: center;' width='100%'>");
		corpo.append("	<tr>");
		corpo.append("		<th width='20%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Solicitante</b></th>");
		corpo.append("		<th width='30%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Motivo da Solicitação</b></th>");
		corpo.append("		<th width='10%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Status da Autorização</b></th>");
		corpo.append("		<th width='10%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Data da Autorização</b></th>");
		corpo.append("		<th width='20%' style='border-bottom: 1px solid #C4C0C9;'><b>Responsável pela Decisão</b></th>");
		corpo.append("	</tr>");
		corpo.append("	<tr>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9;'>" + chamado.getUsuarioSolicitacao().getNome() + "</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9;'>" + chamado.getResumo() + "</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9; color: green;'>Aprovado</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9; text-align: center;'>" + UtilDate.formatDate(chamado.getDataAutorizacao(), "dd/MM/yyyy HH:mm:ss") + "</td>");
		corpo.append("		<td>" + chamado.getUsuarioAutorizacao().getNome() + "</td>");
		corpo.append("	</tr>");
		corpo.append("	</table>");

		corpo.append("<p>Este é um e-mail automático, não é necessário respondê-lo.</p>");
		corpo.append("<p>Atenciosamente.</p>");
		corpo.append("<p><i>Chamatec</i> - Sistema de Abertura de Chamados</p>");
		corpo.append("<p>Secretaria Municipal de Anápolis</p>");

		email.adicionarEmail(chamado.getUsuarioSolicitacao().getEmail());

		email.setSubtitulo("Chamado Aprovado");
		email.setCorpoEmail(corpo.toString());
		try {
			ChamatecUtil.enviarEmailExchange(email);
		} catch (UnsupportedEncodingException e) {
			throw new ChamatecNegocioException(e);
		} catch (MessagingException e) {
			throw new ChamatecNegocioException(e);
		}
	}

	/**
	 * Envia email para o usuário quando o chamado é reprovado.
	 * 
	 * @throws ChamatecNegocioException
	 */
	private void enviarEmailReprovacao(Chamado chamado) throws ChamatecNegocioException {
		EmailVO email = new EmailVO();
		ChamatecUtil.obterConfiguracoesEmail(email);
		
		StringBuffer corpo = new StringBuffer();
		corpo.append("<p>Prezado(a) Colaborador(a),</b></p>");

		corpo.append("<p style='text-align: justify;'>Informamos que o seu chamado foi <b>reprovado</b>.</p>");
		corpo.append("<table cellpadding='2' cellspacing='2' style='border:1px solid #C4C0C9; text-align: center;' width='100%'>");
		corpo.append("	<tr>");
		corpo.append("		<th width='20%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Solicitante</b></th>");
		corpo.append("		<th width='30%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Motivo da Solicitação</b></th>");
		corpo.append("		<th width='10%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Status da Autorização</b></th>");
		corpo.append("		<th width='10%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Motivo</b></th>");
		corpo.append("		<th width='10%' style='border-right: 1px solid #C4C0C9; border-bottom: 1px solid #C4C0C9;'><b>Data da Autorização</b></th>");
		corpo.append("		<th width='20%' style='border-bottom: 1px solid #C4C0C9;'><b>Responsável pela Decisão</b></th>");
		corpo.append("	</tr>");
		corpo.append("	<tr>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9;'>" + chamado.getUsuarioSolicitacao().getNome() + "</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9;'>" + chamado.getResumo() + "</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9; color: red;'>Reprovado</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9; text-align: center;'>" + chamado.getMotivoReprovacao() + "</td>");
		corpo.append("		<td style='border-right: 1px solid #C4C0C9; text-align: center;'>" + UtilDate.formatDate(chamado.getDataAutorizacao(), "dd/MM/yyyy HH:mm:ss") + "</td>");
		corpo.append("		<td>" + chamado.getUsuarioAutorizacao().getNome() + "</td>");
		corpo.append("	</tr>");
		corpo.append("	</table>");

		corpo.append("<p>Este é um e-mail automático, não é necessário respondê-lo.</p>");
		corpo.append("<p>Atenciosamente.</p>");
		corpo.append("<p><i>Chamatec</i> - Sistema de Abertura de Chamados</p>");
		corpo.append("<p>Secretaria Municipal de Anápolis</p>");

		email.adicionarEmail(chamado.getUsuarioSolicitacao().getEmail());

		email.setSubtitulo("Chamado Reprovado");
		email.setCorpoEmail(corpo.toString());
		try {
			ChamatecUtil.enviarEmailExchange(email);
		} catch (UnsupportedEncodingException e) {
			throw new ChamatecNegocioException(e);
		} catch (MessagingException e) {
			throw new ChamatecNegocioException(e);
		}
	}
}